package com.tqz.event;

import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>定义统一的事件管理
 *
 * @author tianqingzhao
 * @since 2021/6/8 16:34
 */
public class EventManager {

    /**
     * 记录对事件的发布和对该事件进行监听的监听器
     */
    public static Map<String, List<ApplicationListener>> map = new HashMap<>();

    /**
     * 注册监听
     *
     * @param listener
     */
    public static void addListener(ApplicationListener listener) {
        //获取泛型类
        Class arg = (Class) ((ParameterizedType) listener.getClass().getGenericInterfaces()[0]).getActualTypeArguments()[0];
        String name = arg.getName();
        if (!map.containsKey(name)) {
            map.put(name, new ArrayList<>());
        }
        map.get(name).add(listener);
    }

    /**
     * 发布事件
     *
     * @param event
     */
    public static void publishEvent(ApplicationEvent event) {

        if (map.containsKey(event.getClass().getName())) {
            List<ApplicationListener> list = map.get(event.getClass().getName());
            for (ApplicationListener listener : list) {
                listener.onApplicationEvent(event);
            }
        }
    }

}
